import Vue from 'vue'
import { _get, _post } from './httpWrap'
import { isObject } from 'assets/utils'
import symbolManager from 'assets/symbolManager'
import config from './config'
import log from './log'
/**
 * 单例模式：
 * 直接在下面添加请求函数，或者另外新建一个.ts文件，比如有一个apis.ts
 * import apis from './apis
 * 
 * const request = {
 *     ...apis
 * }
 * 
 * 使用时: this.http.xxx<T>()
 * 
 * 多例模式：
 * 根据业务或者模块不同，将不同的请求分开维护，比如有一个登录模块，在本目录新建auth.ts
 * import auth from './auth'
 * 
 * const request = {
 *     // 注意： 不需要展开，auth即为module名
 *     auth
 * }
 * 
 * 使用时: this.http.auth.xxx<T>()
 */

const request = {
    // server端对接的http接口均在此声明(调用$get | $delete | $post | $put)
    // 如有需要,可在最后一个参数中指定其他域名({ baseURL: 'http://192.168.20.186:80' }),该项参数可选
    // 新增：fromThirdOrg参数，为true时可避免url被自动添加组织名，默认为false，如下例
    // succ会在server端成功返回response时调用

    // allapps (succ, fail): void {
    //     _get('api/config/allapps', succ, fail, { baseURL: 'http://192.168.20.186:80', fromThirdOrg: true })
    // }
    ...config,
    ...log
}

const getFunc = (target, key) => {
    if (!Object.prototype.hasOwnProperty.call(target, key)) {
        return target[key]
    }
    if (isObject(target[key])) {
        return new Proxy(target[key], {
            get: getFunc
        })
    } else if (typeof target[key] === 'function') {
        return new Proxy(target[key], {
            apply (target, ctx, args) {
                Object.defineProperty(Vue.prototype, symbolManager.get('httpConfig'), {
                    value: args[args.length - 1],
                    writable: false,
                    configurable: true
                })
                return Reflect.apply(target, ctx, args)
            }
        })
    } else {
        return target[key]
    }
}

type ServerRequests = typeof request

export type { ServerRequests }

export default new Proxy(request, {
    get: getFunc
})
